# pip install openpyxl==3.1.2
from openpyxl import Workbook, load_workbook
from tkinter import filedialog
import openpyxl
import os
import pandas as pd


class excel_tools:
    """
    初始化，打开文件对话框
    """
    def __init__(self):
         self.excel_file= filedialog.askopenfilename(title='导入EXCEL', filetypes=[('Excel', '*.xlsx')])

    @property
    def open_excel(self):
        """
        打开Excel封装
        """
        workbook = load_workbook(self.excel_file)
        return workbook

    def read_all(self, sheet_name):
        """
        读取工作表内所有内容
        :param sheet_name: 工作表
        :return:
        """
        wb = self.open_excel
        ws = wb[sheet_name]
        all_values = []
        for row in ws.iter_rows():
            row_values = []
            for cell in row:
                row_values.append(cell.value)
            all_values.append(row_values)
        return all_values
    # 注意：返回结果都存放在了一个list中，如果数据量非常大的情况下，谨慎读取全部内容

    def read_range1(self,sheet_name):
        """
        取一定区域范围的值
        """
        wb = self.open_excel
        ws = wb[sheet_name]
        #####==========================================
        # print(ws.values)   # 是一个可迭代的对象
        # print(ws.dimensions)  # A1:H459
        # print(ws.max_row)    # 459
        # print(ws.max_column) # 8
        all_values = []
        for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=6,max_col=ws.max_column):
            row_values = []
            for cell in row:
                # print(cell.value)
                row_values.append(cell.value)
            all_values.append(row_values)
        return all_values

    def read_range2(self, sheet_name):
        """
        取一定区域范围的值
        """
        wb = self.open_excel
        ws = wb[sheet_name]
        # cell =  ws["F2:H459"]
        mRo = ws.max_row
        # cell = ws["F" + str(2) + ":H" + str(mRo)]
        cell = ws["F2:H"+str(mRo)]
        # print(cell)
        for i in cell:
            for j in i:
                print(j.value)

    def read_range3(self, sheet_name):
        # list_a = []  # 定义一个空的列表
        # mydics = {}  # 定义一个空的字典1
        # mydics = dict()  # 定义一个空的字典2
        # mytuple = ()   # 定义一个空的元组
        # myset = set()  # 定义一个空的集合
        mydics={}
        wb = self.open_excel
        ws = wb[sheet_name]
        myRows = list(ws.values)[1:]
        for myRow in myRows:
            if not myRow[1] is None:
                mydics[myRow[1]] = myRow[2]

    def split_CGI(self):
        wb = openpyxl.load_workbook('C:/Users/./././???.xlsx')  # 括号中写汇总文件地址
        ws = wb['Sheet1']  # 获取excel表单
        Names = ws['B']  # 获取表单中第二列，我的表单第二列是微信昵称，可以根据实际进行调整
        max_row = ws.max_row  # 获取excel的最大行数

        for Name in Names:  # 第5行代码获得的昵称需要遍历
            Name = Name.value  # 遍历出来的是元祖，需要用value进行取值
            if Name == 'Nick Name':  # 我的excel B1单元格写的是Nick Name，大家可以根据实际调整
                continue
            else:
                wb = openpyxl.load_workbook('C:/Users/./././???.xlsx')
                ws = wb['Sheet1']
                for j in range(max_row, 1, -1):  # 倒着遍历，方便删除时不错序
                    if ws[f'B{j}'].value != Name:
                        ws.delete_rows(j)  # 删除行
                file_path = f'C:/Users/./././{Name}.xlsx'  # 重命名
                wb.save(file_path)  # 保存excel

    def read_excel(self):
        folder_path = 'C:\\\\Users\\\\UserName\\\\Documents\\\\Excel_Files'
        for file_name in os.listdir(folder_path):
            if file_name.endswith('.xlsx'):
                file_path = os.path.join(folder_path, file_name)
                workbook = openpyxl.load_workbook(file_path)
                sheet = workbook.active
                cell_value = sheet.cell(row=1, column=1).value
                print('File Name: ', file_name)
                print('Cell Value: ', cell_value)

    def remov_repeat(self):
        """
        1）如果我们要对完全重复的行进行去重，直接输入以下代码就可以了，默认会保留第一次出现的数据，将后面重复的数据删除：
        data.drop_duplicates()
        2）如果我们要去重某几列重复的行数据：
        data.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
        subset： 列名，可选，默认为None
        keep： {‘first’, ‘last’, False}, 默认值 ‘first’
        first： 保留第一次出现的重复行，删除后面的重复行。
        last： 删除重复项，除了最后一次出现。
        False： 删除所有重复项。
        """
        df = pd.read_excel('分类词.xlsx')
        df.drop_duplicates()
        df.to_excel('分类词去重.xlsx')



if __name__ == '__main__':
    et = excel_tools()
    # print(et.read_all('数据模板'))
    print(et.read_range1('数据模板'))
    et.read_range2('数据模板')